package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.Asignatura;
import Dominio.AsignaturaAlumno;
import Dominio.AsignaturaOfertaAcademica;
import Dominio.Profesor;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class DAOAsignaturasAlumno {
    private String TABLA_ASIGNATURAS_ALUMNO = "asignaturas_alumno";
    private String COLUMNA_CLAVE_ASIGNATURA_ALUMNO = "clv_asignatura_alumno";
    private String COLUMNA_CLAVE_RELACION_ALUMNO_PE = "clv_rel_alumno";
    private String COLUMNA_CLAVE_ASIGNATURA_RETICULA = "clv_asignatura_reticula";    
    private String COLUMNA_ESTADO_ASIGNATURA = "estado_asignatura";
    private AccesoBaseDatos acceso;
    private Connection conexion = null;
    
    public static final int ESTADO_APROBADA = 0;
    public static final int ESTADO_RECURSABLE = 1;    
    public static final int ESTADO_NO_CURSABLE = 2;

    public DAOAsignaturasAlumno(){
        acceso = new AccesoBaseDatos();
        conexion = acceso.abrirConexion();
    }

    public void cerrarConexionAAsignaturaAlumno() {
        acceso.cerrarConexion(conexion);
    }
    
    public void registrarAsignaturaAlumno(int claveRelacionAlumnoPE, int claveAsignaturaReticula, int estadoAsignatura){
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryInsertar = "INSERT INTO " + TABLA_ASIGNATURAS_ALUMNO + " ("
                    + COLUMNA_CLAVE_RELACION_ALUMNO_PE +","
                    + COLUMNA_CLAVE_ASIGNATURA_RETICULA +","
                    + COLUMNA_ESTADO_ASIGNATURA+")"                    
                    + " VALUES ('"
                    +claveRelacionAlumnoPE+"','"
                    +claveAsignaturaReticula+"','"
                    +estadoAsignatura+"')";
            sentencia.executeUpdate(queryInsertar);
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de registrar la Asignatura");
        }
    }

    public void registrarAsignaturaAlumno(int claveInfoAlumno, int claveProgramaEducativo, int claveAsignatura, int claveSemestre, int estadoAsignatura){
        try {
            DAORelacionAlumnoProgramaEducativo daoAPE = new DAORelacionAlumnoProgramaEducativo();
            int claveRelacionAlumnoPE = daoAPE.obtenerClaveRelacion(claveInfoAlumno, claveProgramaEducativo);
            daoAPE.cerrarConexionARelacionAlumnoProgramaEducativo();
            if(claveRelacionAlumnoPE==-1){
                return;
            }
            DAOAsignaturaReticula daoAR = new DAOAsignaturaReticula();
            int claveAsignaturaReticula = daoAR.obtenerClaveAsignaturaSemestre(claveAsignatura, claveSemestre);
            daoAR.cerrarConexionAAsignaturaReticula();
            if(claveAsignaturaReticula==-1){
                return;
            }
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryInsertar = "INSERT INTO " + TABLA_ASIGNATURAS_ALUMNO + " ("
                    + COLUMNA_CLAVE_RELACION_ALUMNO_PE +","
                    + COLUMNA_CLAVE_ASIGNATURA_RETICULA +","
                    + COLUMNA_ESTADO_ASIGNATURA                      
                    + ") VALUES ('"
                    +claveRelacionAlumnoPE+"','"
                    +claveAsignaturaReticula+"','"
                    +estadoAsignatura+"')";
            sentencia.executeUpdate(queryInsertar);
        } catch (SQLException ex) {
            System.out.println("Ocurrió un problema al tratar de registrar la Asignatura");
        }
    }
    
    public AsignaturaAlumno obtenerAsignaturaAlumno(int claveAsignaturaAlumno){
        String queryBusqueda = "SELECT * FROM "+TABLA_ASIGNATURAS_ALUMNO+ " WHERE " + COLUMNA_CLAVE_ASIGNATURA_ALUMNO + " = " + claveAsignaturaAlumno;
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.first();
            if(resultado.getRow() != 0){
                AsignaturaAlumno asignatura = new AsignaturaAlumno();
                asignatura.setClaveAsignaturaAlumno(resultado.getInt(1));
                asignatura.setClaveRelacionAlumnoPE(resultado.getInt(2));
                asignatura.setClaveAsignaturaReticula(resultado.getInt(3));
                asignatura.setEstado(resultado.getInt(4));
                return asignatura;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
            return null;
        }
    }

    public AsignaturaAlumno obtenerAsignaturaAlumno(int claveRelacionAlumnoPE, int claveAsignaturaReticula){
        String queryBusqueda = "SELECT * FROM "+TABLA_ASIGNATURAS_ALUMNO
                + " WHERE " + COLUMNA_CLAVE_RELACION_ALUMNO_PE + " = '" + claveRelacionAlumnoPE +"' AND "
                + COLUMNA_CLAVE_ASIGNATURA_RETICULA + " = '" + claveAsignaturaReticula +"'";
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.first();
            if(resultado.getRow() != 0){
                AsignaturaAlumno asignatura = new AsignaturaAlumno();
                asignatura.setClaveAsignaturaAlumno(resultado.getInt(1));
                asignatura.setClaveRelacionAlumnoPE(resultado.getInt(2));
                asignatura.setClaveAsignaturaReticula(resultado.getInt(3));
                asignatura.setEstado(resultado.getInt(4));
                return asignatura;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
            return null;
        }
    }

    public AsignaturaAlumno obtenerAsignaturaAlumno(int claveInfoAlumno, int claveProgramaEducativo, int claveAsignatura, int claveSemestre){
        DAORelacionAlumnoProgramaEducativo daoAPE = new DAORelacionAlumnoProgramaEducativo();
        int claveRelacionAlumnoPE = daoAPE.obtenerClaveRelacion(claveInfoAlumno, claveProgramaEducativo);
        daoAPE.cerrarConexionARelacionAlumnoProgramaEducativo();
        if(claveRelacionAlumnoPE==-1){
            return null;
        }
        DAOAsignaturaReticula daoAR = new DAOAsignaturaReticula();
        int claveAsignaturaReticula = daoAR.obtenerClaveAsignaturaSemestre(claveAsignatura, claveSemestre);
        daoAR.cerrarConexionAAsignaturaReticula();
        if(claveAsignaturaReticula==-1){
            return null;
        }
        String queryBusqueda = "SELECT * FROM "+TABLA_ASIGNATURAS_ALUMNO
                + " WHERE " + COLUMNA_CLAVE_RELACION_ALUMNO_PE + " = '" + claveRelacionAlumnoPE +"' AND "
                + COLUMNA_CLAVE_ASIGNATURA_RETICULA + " = '" + claveAsignaturaReticula +"'";
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            resultado.first();
            if(resultado.getRow() != 0){
                AsignaturaAlumno asignatura = new AsignaturaAlumno();
                asignatura.setClaveAsignaturaAlumno(resultado.getInt(1));
                asignatura.setClaveRelacionAlumnoPE(resultado.getInt(2));
                asignatura.setClaveAsignaturaReticula(resultado.getInt(3));
                asignatura.setEstado(resultado.getInt(4));
                return asignatura;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
            return null;
        }
    }

    public void eliminarAsignaturaAlumno(int claveAsignaturaAlumno) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String deleteQuery = "DELETE FROM " + TABLA_ASIGNATURAS_ALUMNO + " WHERE " + COLUMNA_CLAVE_ASIGNATURA_ALUMNO + " = '" + claveAsignaturaAlumno + "'";
            sentencia.executeUpdate(deleteQuery);
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
        }
    }

    public void actualizarAsignaturaAlumno(int claveAsignaturaAlumno, int nuevaClaveRelacionAlumnoPE, int nuevaClaveAsignaturaReticula, int nuevoEstadoAsignatura) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String queryUpdate = "UPDATE " + TABLA_ASIGNATURAS_ALUMNO + " SET "
                    + COLUMNA_CLAVE_RELACION_ALUMNO_PE + " = '" + nuevaClaveRelacionAlumnoPE + "' ,"
                    + COLUMNA_CLAVE_ASIGNATURA_RETICULA + " = '" + nuevaClaveAsignaturaReticula +"' ,"
                    + COLUMNA_ESTADO_ASIGNATURA + " = '" + nuevoEstadoAsignatura +"' "
                    + " WHERE " + COLUMNA_CLAVE_ASIGNATURA_ALUMNO + " = '" + claveAsignaturaAlumno + "'";
            sentencia.executeUpdate(queryUpdate);
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
        }
    }

    public ArrayList<Asignatura> obtenerAsignaturasPorEstado(int claveInfoAlumno, int claveProgramaEducativo, int estado){
        DAORelacionAlumnoProgramaEducativo daoAPE = new DAORelacionAlumnoProgramaEducativo();
        int claveRelacionAlumnoPE = daoAPE.obtenerClaveRelacion(claveInfoAlumno, claveProgramaEducativo);
        daoAPE.cerrarConexionARelacionAlumnoProgramaEducativo();
        if(claveRelacionAlumnoPE==-1){
            return null;
        }
        String queryBusqueda = "SELECT "+COLUMNA_CLAVE_ASIGNATURA_RETICULA+" FROM "+TABLA_ASIGNATURAS_ALUMNO
                + " WHERE " + COLUMNA_CLAVE_RELACION_ALUMNO_PE + " = " + claveRelacionAlumnoPE +" AND "
                + COLUMNA_ESTADO_ASIGNATURA + " = '" + estado +"'";
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            DAOAsignaturaReticula daoAR = new DAOAsignaturaReticula();
            ArrayList<Asignatura> asignaturas = new ArrayList<Asignatura>();
            while(resultado.next()){
                Asignatura actual = daoAR.obtenerAsignaturaDeReticula(resultado.getInt(1));
                asignaturas.add(actual);
            }
            daoAR.cerrarConexionAAsignaturaReticula();
            resultado.close();
            if(asignaturas.size()>0){
                return asignaturas;
            } else {
                return asignaturas;
            }
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
            return null;
        }
    }

    public ArrayList<AsignaturaOfertaAcademica> obtenerAsignaturasPorEstadoOfertada(String claveOferta, int claveInfoAlumno, int claveProgramaEducativo, int estado){
        //Para obtener las asignaturas Cursables(primera vez) se envia -1
        DAOOfertaAcademica daoOA = new DAOOfertaAcademica();
        ArrayList<AsignaturaOfertaAcademica> asignaturasOfertadas = daoOA.buscarOfertaAcademica(claveOferta).getAsignaturas();
        daoOA.cerrarConexionAOferta();
        ArrayList<Asignatura> asignaturasReticula = obtenerAsignaturasPorEstado(claveInfoAlumno, claveProgramaEducativo, estado);
        ArrayList<AsignaturaOfertaAcademica> resultado = new ArrayList<AsignaturaOfertaAcademica>();
        for(int i=0; i<asignaturasReticula.size(); i++){
            for(int j=0; j<asignaturasOfertadas.size(); j++){
                if(asignaturasReticula.get(i).getClave_asignatura()==asignaturasOfertadas.get(j).getClaveAsignatura()){
                    resultado.add(asignaturasOfertadas.get(j));
                    break;
                }
            }
        }
        return resultado;
    }

    public ArrayList<AsignaturaOfertaAcademica> obtenerAsignaturasCursablesOfertada(String claveOferta, int claveInfoAlumno, int claveProgramaEducativo){
        ArrayList<AsignaturaOfertaAcademica> resultado = obtenerAsignaturasPorEstadoOfertada(claveOferta, claveInfoAlumno, claveProgramaEducativo, -1);
        return resultado;
    }
    
    public ArrayList<AsignaturaOfertaAcademica> obtenerAsignaturasProfesorPorEstado(int claveInfoAlumno, int claveProgramaEducativo, int estado){
        ArrayList<AsignaturaOfertaAcademica> asignaturas = new ArrayList<AsignaturaOfertaAcademica>();
        
        DAORelacionAlumnoProgramaEducativo daoAPE = new DAORelacionAlumnoProgramaEducativo();
        int claveRelacionAlumnoPE = daoAPE.obtenerClaveRelacion(claveInfoAlumno, claveProgramaEducativo);
        daoAPE.cerrarConexionARelacionAlumnoProgramaEducativo();
        if(claveRelacionAlumnoPE==-1){
            return null;
        }
        String queryBusqueda = "SELECT * FROM "+TABLA_ASIGNATURAS_ALUMNO
                + " WHERE " + COLUMNA_CLAVE_RELACION_ALUMNO_PE + " = " + claveRelacionAlumnoPE +" AND "
                + COLUMNA_ESTADO_ASIGNATURA + " = '" + estado +"'";
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            DAOAsignaturaReticula daoAR = new DAOAsignaturaReticula();
            
            
            while(resultado.next()){
                int claveProfesor = resultado.getInt(4);
                int claveAsignaturaReticula = resultado.getInt(3);
                                
                Asignatura actual = daoAR.obtenerAsignaturaDeReticula(claveAsignaturaReticula);
                int claveAsignatura = actual.getClave_asignatura();
                
                Profesor profesor = new Profesor();
                profesor.setClaveProfesor(claveProfesor); 
                
                AsignaturaOfertaAcademica asignaturaOferta = new AsignaturaOfertaAcademica();
                asignaturaOferta.setClaveAsignatura(claveAsignatura); 
                asignaturaOferta.setMaestro(profesor);
                
                asignaturas.add(asignaturaOferta);
            }
            daoAR.cerrarConexionAAsignaturaReticula();
            resultado.close();
           
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());           
        }
        
        return asignaturas;
    }
        
    public ArrayList<AsignaturaOfertaAcademica> obtenerAsignaturasDeOfertaAcademica(String claveOferta) {
        DAOOfertaAcademica daoOA = new DAOOfertaAcademica();
        ArrayList<AsignaturaOfertaAcademica> asignaturasOfertadas = daoOA.buscarOfertaAcademica(claveOferta).getAsignaturas();
        daoOA.cerrarConexionAOferta();
        
        return asignaturasOfertadas;
    }
    
    public ArrayList<AsignaturaOfertaAcademica> obtenerAsignaturasPorEstadoOfertada2(ArrayList<AsignaturaOfertaAcademica> asignaturasOfertadas,/* String claveOferta,*/ int claveInfoAlumno, int claveProgramaEducativo, int estado){
        //Para obtener las asignaturas Cursables(primera vez) se envia -1
        
        ArrayList<Asignatura> asignaturasReticula = obtenerAsignaturasPorEstado(claveInfoAlumno, claveProgramaEducativo, estado);
        ArrayList<AsignaturaOfertaAcademica> resultado = new ArrayList<AsignaturaOfertaAcademica>();
        
        /*
        for(int i=0; i<asignaturasReticula.size(); i++){
            for(int j=0; j<asignaturasOfertadas.size(); j++){
                if(asignaturasReticula.get(i).getClave_asignatura()== asignaturasOfertadas.get(j).getClaveAsignatura()){
                    resultado.add(asignaturasOfertadas.get(j));
                    break;
                }
            }
        }
        */
        
        for(int j=0; j<asignaturasOfertadas.size(); j++){
            for(int i=0; i<asignaturasReticula.size(); i++){
                if(asignaturasReticula.get(i).getClave_asignatura()== asignaturasOfertadas.get(j).getClaveAsignatura()){
                    resultado.add(asignaturasOfertadas.get(j));
                    break;
                }
            }
        }
                                        
        return resultado;
    }
    
    public int obtenerNumeroDeAsignaturasDelAlumno(int claveRelacionAlumnoPE) {
        int numeroDeAsignaturas = 0;
        
        String queryBusqueda = "SELECT * FROM "+TABLA_ASIGNATURAS_ALUMNO+" WHERE " + COLUMNA_CLAVE_RELACION_ALUMNO_PE + " = " + claveRelacionAlumnoPE;
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            
            while(resultado.next()){
                numeroDeAsignaturas++;
           } 
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());       
        }
        
        return numeroDeAsignaturas;
    }   
    
    public void eliminarAsignaturasDelAlumno(int claveRelacionAlumnoPE) {
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String deleteQuery = "DELETE FROM " + TABLA_ASIGNATURAS_ALUMNO + " WHERE " + COLUMNA_CLAVE_RELACION_ALUMNO_PE + " = '" + claveRelacionAlumnoPE + "'";
            sentencia.executeUpdate(deleteQuery);
        } catch (SQLException ex) {
            System.err.println("Problemas de SQL:\n"+ex.toString());
        }
    }
}
